#include "NormalModeServer.h"
#include "conexiones.h"
#include "JugadorServerImp.h"
#include "MensajeTextura.h"
#include "protocolo.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace red::protocolo;

NormalModeServer::NormalModeServer(Conexiones &p_Conexiones, string pathTextura, string pathXmlMapa) :
	m_Conexiones(p_Conexiones) {

	this->m_Mutex_bTerminar.lock();
	this->m_bTerminar = false;
	this->m_Mutex_bTerminar.unlock();
	this->pathTextura = pathTextura;
	this->pathXmlMapa = pathXmlMapa;
}

bool NormalModeServer::getTerminado() {

	bool t_b = false;

	this->m_Mutex_bTerminar.lock();
	t_b = this->m_bTerminar;
	this->m_Mutex_bTerminar.unlock();

	return t_b;
}

void NormalModeServer::finalizar() {
	for (int i = 0; i < this->m_Conexiones.size(); i++) {
		this->m_Conexiones.terminarConexion(i);
	}
}

void NormalModeServer::broadcast(string mensaje) {
	for (int i = 0; i < this->m_Conexiones.size(); i++) {
		m_Mutex_Protocolo.lock();
		Protocolo t_Protocolo(this->m_Conexiones.get(i).pSocket);
		t_Protocolo.bEnviarPaquete(mensaje);
		m_Mutex_Protocolo.unlock();
	}
}

void NormalModeServer::broadcast(Mensaje& mensaje) {
	for (int i = 0; i < this->m_Conexiones.size(); i++) {
		m_Mutex_Protocolo.lock();
		Protocolo t_Protocolo(this->m_Conexiones.get(i).pSocket);
		t_Protocolo.EnviarMensaje(mensaje);
		m_Mutex_Protocolo.unlock();
	}
}

void NormalModeServer::enviarMensaje(Jugador* jugador, Mensaje& mensaje) {
	JugadorServerImp* player = (JugadorServerImp*)jugador;
	m_Mutex_Protocolo.lock();
	Protocolo t_Protocolo(player->getSocket());
	t_Protocolo.EnviarMensaje(mensaje);
	m_Mutex_Protocolo.unlock();
}

void NormalModeServer::enviarMensaje(Jugador* jugador, string mensaje) {
	JugadorServerImp* player = (JugadorServerImp*)jugador;
	m_Mutex_Protocolo.lock();
	Protocolo protocolo (player->getSocket());
	protocolo.bEnviarPaquete(mensaje);
	m_Mutex_Protocolo.unlock();
}

void NormalModeServer::enviarMapa(Jugador* jugador) {
	this->enviarMensaje(jugador,"<mapaxml>\n");
	std::ifstream file(this->pathXmlMapa.c_str());
	std::stringstream ss;
	ss << file.rdbuf();
	this->enviarMensaje(jugador,ss.str());
	this->enviarMensaje(jugador,"</mapaxml>\n");
}

void NormalModeServer::enviarTextura(Jugador* jugador) {
	std::ifstream t_ifsTextura(this->pathTextura.c_str(), ios::binary);
	ostringstream t_sTextura;
	
	if (!t_ifsTextura) {
	} else {
		t_sTextura << t_ifsTextura.rdbuf();
		MensajeTextura mensaje(t_sTextura.str());
		enviarMensaje(jugador,mensaje.getXML());
	}
}

void NormalModeServer::setTerminado() {

	this->m_Mutex_bTerminar.lock();
	this->m_bTerminar = true;
	this->m_Mutex_bTerminar.unlock();
}

NormalModeServer::~NormalModeServer()
{
}
